/**
 * @file singleplayergamewidget.h
 * @brief 单人游戏界面组件头文件
 *
 * 基于Snake Game服务文档实现的单人模式游戏界面，
 * 提供简化的游戏渲染和控制功能。
 */

#ifndef SINGLEPLAYERGAMEWIDGET_H
#define SINGLEPLAYERGAMEWIDGET_H

#include <QWidget>
#include <QPainter>
#include <QKeyEvent>
#include <QTimer>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QPushButton>
#include <QJsonObject>
#include <QJsonArray>
#include <QPixmap>
#include <QPoint>
#include <QSize>
#include <QRect>
#include <QColor>
#include <QFont>

/**
 * @class SinglePlayerGameWidget
 * @brief 单人游戏界面组件
 *
 * 根据Snake Game服务文档实现的单人模式游戏界面：
 * - 40x30地图渲染
 * - 实时游戏状态更新
 * - 键盘控制输入
 * - 游戏UI显示
 */
class SinglePlayerGameWidget : public QWidget
{
    Q_OBJECT

public:
    /**
     * @brief 游戏状态数据结构
     */
    struct GameState {
        struct Snake {
            QString player_id;
            QVector<QPoint> body;           // 蛇身位置
            int direction;                  // 当前方向 (0=UP, 1=DOWN, 2=LEFT, 3=RIGHT)
            int score;                      // 分数
            bool is_alive;                  // 是否存活
        };

        struct Food {
            QPoint position;                // 食物位置
            int type;                       // 食物类型 (0=NORMAL, 1=BONUS, 2=SPEED, 3=SLOW)
            int value;                      // 分值
        };

        QVector<Snake> snakes;              // 所有蛇
        QVector<Food> foods;                // 所有食物
        QSize map_size;                     // 地图大小 (40x30)
        int status;                         // 游戏状态 (0=WAITING, 1=PLAYING, 2=PAUSED, 3=FINISHED)
        int tick_count;                     // 游戏tick计数
        int mode;                           // 游戏模式
        bool enable_walls;                  // 是否启用墙壁

        // 从JSON解析
        static GameState fromJson(const QJsonObject& json);
    };

    explicit SinglePlayerGameWidget(QWidget *parent = nullptr);
    ~SinglePlayerGameWidget();

    // === 游戏控制 ===
    /**
     * @brief 更新游戏状态
     * @param state 新的游戏状态
     */
    void updateGameState(const GameState& state);

    /**
     * @brief 显示游戏结束界面
     * @param final_score 最终分数
     */
    void showGameOver(int final_score);

    /**
     * @brief 重置游戏
     */
    void resetGame();

    /**
     * @brief 开始游戏
     */
    void startGame();

    /**
     * @brief 暂停/恢复游戏
     */
    void togglePause();

protected:
    // === 事件处理 ===
    void paintEvent(QPaintEvent *event) override;
    void keyPressEvent(QKeyEvent *event) override;
    void resizeEvent(QResizeEvent *event) override;

signals:
    /**
     * @brief 方向改变信号
     * @param direction 新方向 (0=UP, 1=DOWN, 2=LEFT, 3=RIGHT)
     */
    void directionChanged(int direction);

    /**
     * @brief 暂停请求信号
     */
    void pauseRequested();

    /**
     * @brief 恢复请求信号
     */
    void resumeRequested();

    /**
     * @brief 重新开始请求信号
     */
    void restartRequested();

    /**
     * @brief 退出游戏信号
     */
    void exitGameRequested();

private slots:
    /**
     * @brief 渲染定时器槽
     */
    void onRenderTimer();

    /**
     * @brief 重新开始按钮点击
     */
    void onRestartClicked();

    /**
     * @brief 退出按钮点击
     */
    void onExitClicked();

private:
    // === 渲染方法 ===
    void drawGrid(QPainter& painter);
    void drawSnake(QPainter& painter, const GameState::Snake& snake);
    void drawFood(QPainter& painter, const GameState::Food& food);
    void drawUI(QPainter& painter);
    void drawGameOverScreen(QPainter& painter);
    void calculateCellSize();
    int calculateBodyType(const QPoint& prev, const QPoint& current, const QPoint& next);

    // === UI设置 ===
    void setupUI();
    void setupGameArea();
    void loadImages();

    // === 游戏状态 ===
    GameState m_currentState;
    QSize m_cellSize;                   // 每个格子的像素大小
    QRect m_gameArea;                   // 游戏区域
    bool m_gameOver;
    bool m_gamePaused;
    int m_finalScore;
    bool m_hasServerState;              // 是否已收到服务器状态

    // === UI组件 ===
    QVBoxLayout* m_mainLayout;
    QHBoxLayout* m_topLayout;
    QLabel* m_scoreLabel;
    QLabel* m_timeLabel;
    QLabel* m_statusLabel;
    QPushButton* m_restartButton;
    QPushButton* m_exitButton;

    // === 渲染资源 ===
    QPixmap m_snakeHeadImages[4];       // 蛇头图片 (4个方向)
    QPixmap m_snakeBodyImages[6];       // 蛇身图片 (直线+转角)
    QPixmap m_foodImages[4];            // 食物图片 (4种类型)

    // === 定时器 ===
    QTimer* m_renderTimer;              // 渲染定时器 (60FPS)

    // === 颜色配置 ===
    QColor m_backgroundColor;
    QColor m_gridColor;
    QColor m_snakeHeadColor;
    QColor m_snakeBodyColor;
    QColor m_foodColors[4];
};

#endif // SINGLEPLAYERGAMEWIDGET_H
